/*
 * Copyright (c) 2021. Moses All Right Reserved
 */

package com.moses.design_patterns.proxy.dynamic_proxy.jdk;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**
 * @author Moses
 * @email shenhuohui@gmail.com
 * @date 2021/4/10 23:27
 */
public class DynamicProxy<T> {
    // 泛型 T 使用前需要再次声明 <T>
    public static <T> T getProxy(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler){
        // 生成一个代理类，该代理类实现了所有传入的接口 interfaces
        // 并且对代理类中每个方法进行调用时，都会出发 handler 中的 invoke 方法
        return (T) Proxy.newProxyInstance(loader, interfaces, handler);
    }

    public static <T> T getProxy(Object target, InvocationHandler handler){
        // 生成一个代理类，该代理类实现了所有传入的接口 interfaces
        // 并且对代理类中每个方法进行调用时，都会出发 handler 中的 invoke 方法
        return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), handler);
    }
}
